8677
9641
在comp.lang.c ++。moderated上阅读了C ++ / STL的“隐藏功能”和“黑暗角落”之后,我完全惊讶于以下代码段在Visual Studio 2008和G ++ 4.4中都可以编译并正常工作。
这是代码:
#include 
int main()
{
整数x = 10;
while(x-> 0)// x变为0
{
printf(“%d”,x);
}
}
输出:
9 8 7 6 5 4 3 2 1 0
我认为这是C,因为它也可以在GCC中使用。该标准在哪里定义,以及它来自何处? 
->不是运算符。实际上,它是两个单独的运算符,-和>。
条件代码将x递减,同时返回x的原始(未递减)值,然后使用>运算符将原始值与0比较。
为了更好地理解,该语句可以编写如下:
while((x--)> 0)
|
或者对于完全不同的东西... x滑到0。
而(x-\
\
\
\
> 0)
printf(“%d”,x);
并不是那么数学,但是...每张画都画一千个字...
|
这是一个非常复杂的运算符,因此即使是ISO / IEC JTC1(联合技术委员会1)也将其说明放在C ++标准的两个不同部分中。
除了开玩笑,它们是两个不同的运算符:-和>分别在C ++ 03标准的5.2.6 / 2和5.9节中进行了描述。
|
相当于
而(x--> 0)
x--(后减量)等效于x = x-1,因此代码转换为:
while(x> 0){
x = x-1;
//逻辑
}
X - ; //当x <= 0时完成后递减
|
x可以在相反的方向更快地变为零:
整数x = 10;
而(0 <---- x)
{
printf(“%d”,x);
}
8 6 4 2
您可以用箭头控制速度!
整数x = 100;
while(0 <-------------------- x)
{
printf(“%d”,x);
}
90 80 70 60 50 40 30 20 10
;)
|
它的
#include 
int main(void){
整数x = 10;
while(x--> 0){// x变为0
printf(“%d”,x);
}
返回0;
}
只是空间使事情看起来很有趣,即递减并进行比较。
|
->的用法具有历史意义。减少(在某些情况下仍然是)比在x86架构上增加要快。使用->表示x将为0,并且吸引那些具有数学背景的人。
|
而(x--> 0)
是这样解析的。
|
极客,但我会用这个:
#定义为;
int main(int argc,char * argv [])
{
int n = atoi(argv [1]);
将printf(“ n为%d \ n”,n)做为(n-> 0);
返回0;
}
|
我读过的一本书(我不记得是哪本书)说:编译器尝试使用左右规则将表达式解析为最大标记。
在这种情况下,表达式为:
x-> 0
解析为最大令牌:
令牌1:x
令牌2:-
令牌3:>
令牌4:0
结论:x--> 0
相同的规则适用于此表达式:
a ----- b
解析后:
令牌1:
令牌2:-
令牌3:-
令牌4:-
令牌5:b
结论:(a-)--b
我希望这有助于理解复杂的表达方式^^
|
这与
而(x--)
{
printf(“%d”,x);
}
对于非负数
|
无论如何,我们现在有一个“转到”运算符。容易记住“->”是一个方向,“ x趋于零时”是直截了当的。
此外,它在某些平台上比“ for(x = 10; x> 0; x-)”有效。
|
此代码首先将x与0比较,然后将x减1。 (也请在第一个答案中说:先递减x,然后将x和0与>运算符进行比较。)请参见以下代码的输出:
9 8 7 6 5 4 3 2 1 0
现在,我们首先进行比较,然后通过在输出中看到0来递减。
如果我们要先递减然后比较,请使用以下代码:
#include 
int main(无效)
{
整数x = 10;
while(--x> 0)// x变为0
{
printf(“%d”,x);
}
返回0;
}
该输出是:
9 8 7 6 5 4 3 2 1
|
运行此代码时,我的编译器将打印出9876543210。
#include 
int main()
{
整数x = 10;
while(x-> 0)// x变为0
{
std :: cout << x;
}
}
如预期的那样。 while(x--> 0)实际上意味着while(x> 0)。 x--后减x。
而(x> 0)
{
X - ;
std :: cout << x;
}
是写同一件事的另一种方式。
很好的是,原来看起来像“而x变为0”。
|
-和>之间缺少空格。 x是递减的,也就是说,在检查条件x> 0?之后递减。
|
-是减量运算符,而>是大于运算符。
这两个运算符像->一样应用为一个。
|
它是两个运算符的组合。首先-用于减小值,而>用于检查该值是否大于右侧操作数。
#include 
int main()
{
整数x = 10;
而(x--> 0)
printf(“%d”,x);
返回0;
}
输出将是:
9 8 7 6 5 4 3 2 1 0
|
实际上,x是递减的,并且正在检查该条件。不是->(x--)> 0
注意:检查条件后,x的值会更改,因为它会递减。也会发生一些类似的情况,例如:
-> x-> 0
++> x ++> 0
-> = x-> = 0
++> = x ++> = 0
|
C和C ++遵循“最大嚼数”规则。将a --- b转换为(a--)-b的方法相同,在您的情况下,x-> 0转换为(x-)> 0。
规则本质上是说,从左到右,表达式是通过采用将构成有效表达式的最大字符组成的。
|
为什么所有的并发症?
原始问题的简单答案是:
#include 
int main()
{
整数x = 10;
而(x>0)
{
printf(“%d”,x);
x = x-1;
}
}
它做同样的事情。我并不是说您应该这样做,但是它做同样的事情,并且会在一篇文章中回答该问题。
x--只是上述的简写,而>只是普通的大于运算符。没什么大不了的!
如今有太多人使简单的事情变得复杂;)
|
以常规方式,我们将在while循环括号()中定义一个条件,并在括号{}中定义一个终止条件,但是->会同时定义两者。
例如:
int abc(无效)
{
整数a = 5
while(((a--)> 0)//同时减少和比较
{
//代码
}
}
这将使a减小并在a大于0时运行循环。
按照惯例,它将是:
int abc(无效)
{
整数= 5;
而(a> 0)
{
一种 - ;
//代码
}
一种 - ;
}
两种方式,我们都做相同的事情,实现相同的目标。
|
(x-> 0)表示(x--> 0)。
您可以使用(x->)输出:9 8 7 6 5 4 3 2 1 0
您可以使用(-x> 0)表示(--x> 0)输出:9 8 7 6 5 4 3 2 1
您可以使用
(-
\
x> 0)
输出:9 8 7 6 5 4 3 2 1
您可以使用
(\
\
x-> 0)
输出:9 8 7 6 5 4 3 2 1 0
您可以使用
(\
\
x-> 0
\
\
)
输出:9 8 7 6 5 4 3 2 1 0
您也可以使用
(
X
->
)
输出:9 8 7 6 5 4 3 2 1 0
同样,您可以尝试许多方法来成功执行此命令。
|
这是一元后递减运算符。
while(x--> 0)// x变为0
{
printf(“%d”,x);
}
在开始时,条件将评估为
(x> 0)// 10> 0
现在因为条件为真,它将以减小的值进入循环
x-- // x = 9
这就是为什么第一个打印值是9
等等。在最后一个循环中x = 1,因此条件为true。按照一元运算符,在打印时该值变为x = 0。
现在,x = 0,它将条件(x> 0)评估为false,而while循环退出。
|
->根本不是运算符。我们有一个类似于->的运算符,但不像->那样。这只是对while(x--> 0)的错误解释,这仅意味着x具有后减量运算符,并且此循环将一直运行到大于零为止。
编写此代码的另一种简单方法是while(x--)。 while循环将在出现错误条件时停止,并且这里只有一种情况,即0。因此,当x值减小到零时,它将停止。
|
高度活跃的问题。赢得10个声誉才能回答这个问题。信誉要求有助于保护该问题免受垃圾邮件和非答复活动的侵害。
不是您要找的答案?浏览标记为c ++ c运算符代码格式符合标准的其他问题,或询问您自己的问题。